#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-05-11 22:32
# @Author : youngchaolin

''''''

# 1 求出50以内能被3整除的数的平方，并放入到列表中
li=[i**2 for i in range(1,50,1) if i%3==0]
print(li)

# 2 构建一个列表：[(0,1),(1,2),(2,3),(3,4),(4,5),(5,6)]
li=[(i,i+1) for i in range(6)]
print(li)

# 3 有一个列表l1=['alex','wusir','老男孩'，'太白']
# 将其构造成这种列表['alex0','wusir1','老男孩2'，'太白3']
l1=['alex','wusir','老男孩','太白']
li=[l1[index]+str(index) for index in range(4)]
print(li)

# 4 现有如下数据
x={
    'name':'alex',
    'value':[{'timestamp':190111,'value':100},
            {'timestamp':200222,'value':200},
            {'timestamp':210333,'value':300},
            {'timestamp':220444,'value':400},
            {'timestamp':230555,'value':500},
    ]
}

# 将上面的数据通过列表推导式转换成下面的类型
# [[190111,100],[200222,200],[210333,300],[220444,400],[230555,500]]
li=[[dic['timestamp'],dic['value']] for dic in x.get('value')]
print(li)

# 5 有一个列表，里面包含三种不同尺寸的T恤，每种尺寸都有两种两种颜色，使用列表推导式构建尺寸和颜色的笛卡尔积
colors=['black','white']
sizes=['S','M','L']
li=[(color,size) for color in colors for size in sizes]
print(li)

# 6 构建一个列表，打印扑克牌中除大小王，所有的牌类
shapes=['♥','♠','♣','♦']
numbers=['A','2','3','4','5','6','7','8','9','10','J','Q','K']
li=[(shape,number) for shape in shapes for number in numbers]
print(li)

# 7 看下面代码，能否对其进行简化，说说简化后的优点
def chain(*args):
    for it in args:
        # for i in it:
        #     yield i
        # 上面使用yield from来简化,优化内存循环，提高了效率
        yield from it
# 调用
g=chain('messi',[1,2,3])
# next调用
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# 或者将生成器转换成列表，然后再循环打印
li=list(g)
for item in li:
    print(item)

# 8 看代码算结果
v=[i%2 for i in range(10)]
print(v) # [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
k=(i%2 for i in range(10))
print(k) # <generator object <genexpr> at 0x00000216F390EF68>

# 9 看代码求结果（面试题）
def demo():
    for i in range(4):
        yield i

g=demo()
# 以下都是生成器表达式
g1=(i for i in g) # 注意g1是生成器
g2=(i for i in g1)

print(list(g1)) # 在list方法里已经对g1取值完了
print(g1)
print(list(g2)) # []

# 10 看代码求结果，巨坑题，反正我第一次做就做错了，个人觉得没啥意义
def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
print(g)

for n in [1,10]:
    # 第一次循环
    # g=(add(1,i) for i in g)
    # 第二次循环
    # g=(add(10,i) for i in g)
    g=(add(n,i) for i in g) # (1,2,3,4)

print(list(g)) # [20, 21, 22, 23]
# 当执行list(g)，其实内部会执行以下逻辑
# print(list((add(10,i) for i in g)))
# print(list((add(10,i) for i in ((add(10,i) for i in g)))))
print(list((add(10,i) for i in ((add(10,i) for i in [0,1,2,3])))))


